package M;

import java.lang.reflect.Field;

import sun.misc.Unsafe;

public class Demo {
	public static void main(String[] args) throws Exception {
		/* ******************************************************************* *
		 * 通过 Unsafe 直接分配内存，储存超大序列对象。
		 * 方式类似于 byte[] 。但是 byte[]可传入长度最大为Integer.MAX_VALUE
		 * 如果此时需要非常巨大的数组存储内容，则可以自行分配需要的内存空间大小
		 * 自己分配的内存大小最大为Long.MAX_VALUE
		 * 但是这种用法已脱离vm内存自动管理,gc时候不会回收，所以使用完后一定要自己回收。
		 * 如果使用不当，创建的内存地址未被回收则会导致(内存溢出严重错误)
		 * ******************************************************************* */
		Field theUnsafe = sun.misc.Unsafe.class.getDeclaredField("theUnsafe");
		theUnsafe.setAccessible(true);
		sun.misc.Unsafe unsafe = (Unsafe) theUnsafe.get(null);
		
		long memoryAddress = unsafe.allocateMemory(8);  // 分配8字节内存空间 每个字节最大值是 byte
		
		unsafe.putInt(memoryAddress, 100);  // 设置int 类型 ，int 占4位地址 每位地址是 1字节
		unsafe.putInt(memoryAddress+4, 200);// 设置int 类型 ，int 占4位地址 每位地址是 1字节
		
		System.out.println(unsafe.getInt(memoryAddress)); // 获得 前四位地址 转为int
		System.out.println(unsafe.getInt(memoryAddress+4)); // 获得 四位地址 转为int
		
		unsafe.freeMemory(memoryAddress); // 释放内存空间 不释放则会内存溢出
	}
}
